🧩 一、策略文件基础结构
MinIO 策略文件是标准的 JSON 文档,结构如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::mybucket/*"]
}
]
}
字段说明
| 字段名 | 类型 | 说明 |
|---|---|---|
| Version | 字符串 | 固定为 "2012-10-17",表示策略语法版本 |
| Statement | 数组 | 权限语句集合,可以包含多个对象 |
| Effect | 字符串 | "Allow"(允许)或 "Deny"(拒绝) |
| Action | 数组 | 指定允许/拒绝的操作类型 |
| Resource | 数组 | 指定策略作用的资源(bucket 或对象路径) |
🧱 二、资源标识符(Resource)说明
MinIO 采用与 AWS 一致的 ARN(Amazon Resource Name)格式来标识资源:
arn:aws:s3:::bucket-name[/object-path/*]
| 示例 | 含义 |
|---|---|
"arn:aws:s3:::mybucket" |
指代桶本身(bucket-level 操作) |
"arn:aws:s3:::mybucket/*" |
桶内所有对象(object-level 操作) |
"arn:aws:s3:::mybucket/projectA/*" |
限制访问到特定路径下的对象 |
"arn:aws:s3:::*" |
所有桶(⚠️谨慎使用) |
⚙️ 三、Action(操作)对照表
| 操作类型 | Action 值 | 说明 |
|---|---|---|
| 查看对象 | s3:GetObject |
读取、下载对象 |
| 上传对象 | s3:PutObject |
上传文件 |
| 删除对象 | s3:DeleteObject |
删除对象 |
| 列出对象 | s3:ListBucket |
查看 bucket 文件列表 |
| 获取桶信息 | s3:GetBucketLocation |
获取桶位置信息 |
| 创建桶 | s3:CreateBucket |
创建新 bucket |
| 删除桶 | s3:DeleteBucket |
删除 bucket |
| 所有操作 | s3:* |
包含以上所有权限(仅限管理员) |
💡 对象级操作(如 Get/Put/Delete)适用于
bucket/*,
桶级操作(如 ListBucket)适用于bucket。
📜 四、常见策略模板
✅ 1️⃣ 只读策略(ReadOnly)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": ["arn:aws:s3:::<bucket>"]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": ["arn:aws:s3:::<bucket>/*"]
}
]
}
👉 用户可以浏览与下载对象,但不能上传或删除。
✅ 2️⃣ 只写策略(WriteOnly)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucketMultipartUploads"
],
"Resource": ["arn:aws:s3:::<bucket>"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": ["arn:aws:s3:::<bucket>/*"]
}
]
}
👉 用户可上传对象,但看不到文件列表或内容。
✅ 3️⃣ 读写策略(ReadWrite)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": ["arn:aws:s3:::<bucket>"]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:AbortMultipartUpload",
"s3:ListMultipartUploadParts"
],
"Resource": ["arn:aws:s3:::<bucket>/*"]
}
]
}
👉 最常用的业务策略,允许完整文件操作。
✅ 4️⃣ 限定路径访问策略(特定目录)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": ["arn:aws:s3:::mybucket/projectA/*"]
}
]
}
👉 用户只能操作 projectA 子目录,不影响其他目录。
✅ 5️⃣ 禁止删除对象(保护数据)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": ["s3:DeleteObject"],
"Resource": ["arn:aws:s3:::mybucket/important/*"]
},
{
"Effect": "Allow",
"Action": ["s3:*"],
"Resource": ["arn:aws:s3:::mybucket/*"]
}
]
}
👉 防止误删重要目录内容。
🧾 五、策略管理命令
| 操作 | 命令示例 |
|---|---|
| 创建策略 | mc admin policy create myminio readonly readonly.json |
| 查看策略 | mc admin policy info myminio readonly |
| 删除策略 | mc admin policy remove myminio readonly |
| 列出策略 | mc admin policy list myminio |
| 绑定到用户 | mc admin policy set myminio readonly user=john |
| 绑定到组 | mc admin policy set myminio readonly group=devteam |
🧰 六、策略与用户关系
每个用户或组都可以绑定一个或多个策略。
查看用户详情(含绑定策略):
mc admin user info myminio <username>
绑定新策略:
mc admin policy attach myminio <policyname> --user <username>
解绑策略:
mc admin policy detach myminio <policyname> --user <username>
🧠 七、编写策略的最佳实践
✅ 1. 最小权限原则(Least Privilege)
只授予用户完成任务所需的最小操作权限。
✅ 2. 桶级与对象级区分清晰
s3:ListBucket→ 作用于 buckets3:GetObject、s3:PutObject→ 作用于对象路径
✅ 3. 合理使用 Deny
Deny 优先级高于 Allow,可用于保护目录或关键数据。
✅ 4. 测试再上线
先用测试用户验证策略生效,再应用到生产。
✅ 5. 版本管理与备份
保存所有策略文件到 Git 仓库,便于审计与回溯。
📚 八、参考命令实践
# 创建策略文件
vim readonly-bucket.json
# 导入策略
mc admin policy create myminio readonly-bucket readonly-bucket.json
# 查看策略内容
mc admin policy info myminio readonly-bucket
# 为用户绑定策略
mc admin policy attach myminio readonly-bucket --user bucketreader
# 验证策略是否生效
mc admin user info myminio bucketreader
🧩 九、示例:多目录分级权限策略
如果你希望用户:
对
projectA目录有读写权限;对
projectB目录仅可读;
可以编写如下复合策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": ["arn:aws:s3:::mybucket/projectA/*"]
},
{
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::mybucket/projectB/*"]
}
]
}
🔒 十、策略调试技巧
- 查看服务器日志:
mc admin trace -v myminio
可实时观察用户请求与策略匹配情况。
- 若策略不生效:
- 检查 Resource 路径是否写错;
- 确认策略已绑定到正确用户;
- 避免使用
arn:aws:s3:::mybucket忘记加/*。